/*
 * @Description:
 * @Author: your name
 * @version:
 * @Date: 2024-05-08 16:11:33
 * @LastEditors: your name
 * @LastEditTime: 2024-09-10 09:39:09
*/
import { defineStore } from "pinia";
import { displayByName } from "@/cesiumTools/controller/effectController";

export const useLineData = defineStore("lineData", {
  // 相当于vue中的data
  state: () => {
    return {
      lineData: [],
    };
  },
  // 相当于vue中的计算属性
  getters: {
    Viewer() {
      return this.viewer;
    },
    Tile() {
      return this.tileset;
    },
    // 获取线路显示隐藏信息
    lineDisplay() {
      return this.lineData.map((item) => ({
        name: item.checked,
        id: item.id,
        name: item.name,
      }));
    },
    // 获取全部信息
    allData() {
      return this.lineData;
    },
  },
  // 相当于vue中的method
  actions: {
    setData(data) {
      return new Promise((resolve, reject) => {
        this.lineData = data.length ? data : [];
        resolve(data);
      });
    },
    setViewer(viewer) {
      return new Promise((resolve, reject) => {
        this.viewer = viewer;
        resolve(viewer);
      });
    },
    setTileset(tileset) {
      return new Promise((resolve, reject) => {
        this.tileset = tileset;
        resolve(tileset);
      });
    },
    // 全局管理路线显隐
    displayLine(lineNames, isShow) {
      // disable指的是图层按钮是否开启
      if (Array.isArray(lineNames) && this.lineData.length && !this.disable) {
        const stationNames = [];
        // 控制state数据
        this.lineData.forEach((item) => {
          const { stationsList, name } = item;
          if (lineNames.includes(name)) {
            item.checked = isShow;
            stationsList.forEach((station) => {
              stationNames.push(station.name);
            });
          }
        });
        // 控制地图元素, lineNames为战线数组, stationNames为站点数组
        displayByName(lineNames, stationNames, isShow);
      }
    },
	  // 设置是否开启全局管理
    disableController(val) {
      this.disable = val;
    }
  },
});

// 由于lineData的state是异步的，所以需要监听action来获取数据
//这个 action 负责异步获取数据并更新 lineData。
//这部分代码定义了一个函数 watchLineData，它允许你监听特定的动作（默认是 setData），并在动作完成后执行某些逻辑。如果动作成功完成，它会解析出结果；如果有错误发生，它会拒绝这个 Promise 并传递错误。
export const watchLineData=(actionName='setData')=>{
  return new Promise((resolve,reject)=>{
    useLineData().$onAction(({name,store,args,after,onError})=>{
      if(name===actionName){
        after((res)=>{
          // console.log(res);
          if(res){
            resolve(res)
          }
        })

        onError((e)=>{
          reject(e)
        })
      }
    })
  })
}

export const useMeasureData = defineStore("measureData", {
  state: () => {
    return {
      measureData: [],
    };
  },
  getters: {
    // 获取全部信息
    allData() {
      return this.measureData;
    },
  },
  actions: {
    setData(data) {
      return new Promise((resolve, reject) => {
        this.measureData = data.length ? data : [];
        resolve(data);
      });
    },
    clearData(){
      return new Promise((resolve,reject)=>{
        const data=this.measureData.map(item=>{
          item.length && item.forEach(n=>n.measures.length=0)
          return item
        })
        this.measureData=data
        resolve(data)
      })
    }
  },
});
